home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
214
/
mandelvroom
/
src
/
cmd.c
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
12KB
|
412 lines
/*
* MandelVroom 2.0
*
* (c) Copyright 1987,1989 Kevin L. Clague, San Jose, CA
*
* All rights reserved.
*
* Permission is hereby granted to distribute this program's source
* executable, and documentation for non-comercial purposes, so long as the
* copyright notices are not removed from the sources, executable or
* documentation. This program may not be distributed for a profit without
* the express written consent of the author Kevin L. Clague.
*
* This program is not in the public domain.
*
* Fred Fish is expressly granted permission to distribute this program's
* source and executable as part of the "Fred Fish freely redistributable
* Amiga software library."
*
* Permission is expressly granted for this program and it's source to be
* distributed as part of the Amicus Amiga software disks, and the
* First Amiga User Group's Hot Mix disks.
*
* contents: this file contains the IntuiMessage handler (also referred to
* as the command handler.) This code implements a command-state state
* machine.
*/
#include "mandp.h"
extern struct Picture *ZoomedPict;
BYTE State;
BYTE Parse_rc;
ProcessCmd(Msg)
struct IntuiMessage *Msg;
{
DecodeClass(Msg); /* decode input by class */
PostProcessMsg(Msg); /* set current pen, contour, or range */
DisplayMsg(); /* Display a message in the title bar */
if (State == IDLESTATE) {
SetNormPointer();
}
}
/*
* This function serves the following purposes:
* 1. Reacts to menu items and command gadgets (overriding whatever
* the outstanding state is.)
* 2. Filters of messages that do not affect the state of
* user interaction (NEWSIZE, REFRESHWINDOW, CLOSEWINDOW...)
* 3. It only allows MOUSEBUTTON messages to get past this
* routine if they are desired.
*/
DecodeClass(Msg)
struct IntuiMessage *Msg;
{
register struct Window *Window = Msg->IDCMPWindow;
struct Picture *Pict;
switch( Msg->Class ) {
/* These Classes can cause State to be set */
case MENUPICK:
HandleMenuPick( Msg );
break;
case GADGETDOWN:
HandleGadgetCmd(Msg);
break;
case MOUSEBUTTONS:
/* filter unwanted SELECTDOWNS and SELECTUPS */
/* So that each of cmd routines below don't */
/* have to ignore them */
if (Msg->IDCMPWindow == ContWind) {
SlideBarCmd(Msg);
} else {
Pict = (struct Picture *) Window->UserData;
if (Pict != NULL) {
/* ignore Project buttons outside the picture area */
if (Msg->Code == SELECTUP || Msg->Code == SELECTDOWN &&
MouseX >= Pict->LeftMarg &&
MouseY >= Pict->TopMarg &&
MouseX < Window->Width - Pict->RightMarg &&
MouseY < Window->Height - Pict->BotMarg ) {
DecodeState(Msg);
}
}
}
break;
/* this message class cancels any command (i.e. clear state ) */
case CLOSEWINDOW:
CloseWinds( Window );
State = IDLESTATE;
break;
/* The response to these message classes depends on what we're
* doing.
*/
case MOUSEMOVE:
DecodeState(Msg);
break;
case GADGETUP:
HandleGadgetCmd(Msg);
/* DecodeState(Msg); */
break;
/* these message classes do not modify state */
case ACTIVEWINDOW:
ActivatePict( Window );
break;
case NEWSIZE:
if (Window != BackWind) {
BorderWindow( Window );
if (Window->UserData) {
ScrollPictCmd(Msg);
}
}
break;
default:
printf("Unexpected msg class %04x\n",Msg->Class);
break;
}
}
DisplayMsg()
{
char *c;
c = NULL;
switch(State) {
case COPYRIGHTSTATE: c = "Copyright 1987,1989 Kevin Clague"; break;
case IDLESTATE: c = "MandelVroom V2.0 by Kevin Clague"; break;
case SETCONTSTATE: c = "You can set color or height"; break;
case ORBITSTATE: c = "Press left mouse button in Project"; break;
case SETJULIASTATE: c = "Press left mouse button in Mand Project"; break;
case ZOOMINSTATE: c = "Place the Zoom box in a Project"; break;
case COPYRGBSTATE: c = "Select a color pen to copy RGBs"; break;
case SPREADRGBSTATE: c = "Select a color pen to spread RGBs"; break;
case XCHGRGBSTATE: c = "Select a color pen to exchange RGBs"; break;
case CYCLERANGESTATE: c = "Select a color pen to complete range"; break;
case SMOOTHCONTSTATE: c = "Select a contour pen to smooth heights"; break;
case CUTCONTSTATE: c = "Select a contour pen to cut a pattern"; break;
case COPYCONTSTATE: c = "Select a contour pen to copy a pattern"; break;
case PASTECONTSTATE: c = "Select a contour pen to paste a pattern"; break;
case HELPSTATE: c = "Select a menu or gadget for help"; break;
case SCROLLPICTSTATE: c = "Use the mouse to pan the current project";break;
case SETHEIGHTSTATE: c = "Mouse changes contour's lower bound"; break;
case SLIDERGBSTATE: c = "Move the mouse to change RGB values"; break;
case SLIDEBARSTATE: c = "Move the mouse to scroll contours"; break;
case RESIZEZOOMSTATE: c = "Move the mouse to size the Zoom box"; break;
case ZOOMDRAGSTATE: c = "Move the mouse to drag the Zoom box"; break;
case PROPRESIZESTATE: c = "Move the mouse to size the Zoom box"; break;
case SCROLLHELPSTATE: c = "Move the mouse to scroll help info."; break;
case SLIDESPEEDSTATE: c = "Move the mouse to change speed"; break;
}
/* only display the message if it is a new one */
if (c && screen->Title != c) {
SetWindowTitles( CurWind, (char *) -1, c );
}
}
DecodeState(Msg)
struct IntuiMessage *Msg;
{
switch(State) {
case COPYRIGHTSTATE:
case IDLESTATE: DecodeMsg(Msg); break;
case COPYRGBSTATE: CopyRGBCmd(Msg); break;
case SPREADRGBSTATE: SpreadRGBCmd(Msg); break;
case XCHGRGBSTATE: ExchangeRGBCmd(Msg); break;
case SLIDERGBSTATE: SlideRGBCmd(Msg); break;
case SETHEIGHTSTATE: SetHeightCmd(Msg); break;
case SETCONTSTATE: SetContCmd(Msg); break;
case SMOOTHCONTSTATE: SmoothContCmd(Msg); break;
case CUTCONTSTATE: CutContCmd(Msg); break;
case COPYCONTSTATE: CopyContCmd(Msg); break;
case PASTECONTSTATE: PasteContCmd(Msg); break;
case SLIDEBARSTATE: SlideBarCmd(Msg); break;
case ORBITSTATE: OrbitCmd(Msg); break;
case ZOOMINSTATE: ZoomInCmd(Msg); break;
case RESIZEZOOMSTATE: ResizeZoomCmd(Msg); break;
case QUERYHEIGHTSTATE: QueryHeightCmd(Msg); break;
case ZOOMDRAGSTATE: ZoomDragCmd(Msg); break;
case PROPRESIZESTATE: PropResizeCmd(Msg); break;
case SETJULIASTATE: SetJuliaCmd(Msg); break;
case SLIDESPEEDSTATE: SlideSpeedCmd(Msg); break;
case CYCLERANGESTATE: CycleRangeCmd(Msg); break;
case SCROLLHELPSTATE: ScrollHelpCmd(Msg); break;
case SCROLLPICTSTATE: ScrollPictCmd(Msg); break;
}
}
/*
* Set Current pen or current contour.
*/
PostProcessMsg(Msg)
struct IntuiMessage *Msg;
{
register struct Window *Window = Msg->IDCMPWindow;
struct Gadget *gadget;
int id;
if (Msg->Class == GADGETDOWN) {
gadget = (struct Gadget *) Msg->IAddress;
id = gadget->GadgetID;
switch (WIND_TYPE(id)) {
case PALTYPE:
if (GADG_TYPE(id) == PALPENS) {
SetCurPen(GADG_NUM(id));
}
break;
case CONTYPE:
if ((GADG_TYPE(id) == CONTSELS || GADG_TYPE(id) == CONTPOTS) &&
id != CONTLAST) {
SelContCmd(Msg);
}
}
}
}
/*
* This is mostly for MOUSEBUTTON related commands (where the MOUSEBUTTONS
* are commands like drag, close or resize zoom box.)
*/
DecodeMsg(Msg)
struct IntuiMessage *Msg;
{
switch( Msg->Class ) {
case MOUSEBUTTONS:
/* query height */
DecodePictMouseButtons( Msg );
break;
}
}
HandleGadgetCmd(Msg)
struct IntuiMessage *Msg;
{
struct Gadget *gadget;
int id, type, num;
if (State == HELPSTATE) {
HelpGadgetCmd(Msg);
State = IDLESTATE;
return;
}
gadget = (struct Gadget *) Msg->IAddress;
id = gadget->GadgetID;
type = GADG_TYPE(id);
switch( WIND_TYPE(id)) {
case PICTTYPE:
State = IDLESTATE;
switch (id) {
case PICTGEN: GenerateCmd(Msg); break;
case PICTIN: ZoomInCmd(Msg); break;
case PICTOUT: ZoomOutCmd(Msg); break;
case PICTJULIA: SetJuliaCmd(Msg); break;
}
MakeCurProj((struct Picture *) Msg->IDCMPWindow->UserData);
break;
case PALTYPE:
StopCycle();
switch (type) {
case PALPENS: DecodeState(Msg); break;
case PALPOTS: SlideRGBCmd(Msg); break;
case PALCNTLS:
switch (id) {
case PALCOPY: CopyRGBCmd(Msg); break;
case PALRANGE: SpreadRGBCmd(Msg); break;
case PALEXCG: ExchangeRGBCmd(Msg); break;
}
break;
}
break;
case CYCTYPE:
switch (type) {
case CYCRNUMS: SelRangeCmd(Msg); break;
case CYCCNTLS:
switch (id) {
case CYCSPEED: SlideSpeedCmd(Msg); break;
case CYCRANGE: CycleRangeCmd(Msg); break;
case CYCDIR: ToggleDirCmd(Msg); break;
case CYCON: CycleOnOffCmd(Msg); break;
}
break;
}
break;
case CONTYPE:
StopCycle();
switch (type) {
case CONTSELS: DecodeState(Msg); break;
case CONTPOTS: SetHeightCmd(Msg); break;
case CONTCNTLS:
switch (id) {
case CONTRECOL: PaintCmd(Msg); break;
case CONTSET: SetContCmd(Msg); break;
case CONTSMTH: SmoothContCmd(Msg); break;
case CONTCUT: CutContCmd(Msg); break;
case CONTCOPY: CopyContCmd(Msg); break;
case CONTPASTE: PasteContCmd(Msg); break;
case CONTCEIL: CeilingCmd(Msg); break;
}
break;
}
break;
case ORBTTYPE:
OrbitCmd(Msg);
break;
case HELPTYPE:
switch (id) {
case HELPUP:
case HELPDOWN:
Page_File(id);
break;
case HELPSCROLL:
ScrollHelpCmd(Msg);
break;
}
}
}
DecodePictMouseButtons( Msg )
struct IntuiMessage *Msg;
{
register struct Node *zNode;
register struct Picture *ZoomPict;
register struct Picture *Pict;
struct Picture *PictAddr();
int rc;
Pict = (struct Picture *) Msg->IDCMPWindow->UserData;
zNode = Pict->zList.lh_Head;
rc = NOTHINGHIT;
while ( rc == NOTHINGHIT && zNode->ln_Succ ) {
ZoomPict = PictAddr( zNode );
switch( rc = CheckPictZoomBox( ZoomPict ) ) {
case ZOOMCLOSEHIT: /* User closed the zoom box */
ClearZoomBox( ZoomPict );
break;
case ZOOMDRAGHIT:
ZoomedPict = ZoomPict;
ZoomDragCmd(Msg);
break;
case ZOOMRESIZEHIT:
ZoomedPict = ZoomPict;
ResizeZoomCmd(Msg);
break;
case PROPRESIZEHIT:
ZoomedPict = ZoomPict;
PropResizeCmd(Msg);
break;
}
zNode = zNode->ln_Succ;
}
if (rc == NOTHINGHIT) {
QueryHeightCmd(Msg);
}
}